package 第十七章_XML与JSON.JSON_GSON过滤自定义版;

import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;

public class Gson_level2_test {
    public static void main(String[] args) {
        Gson_level2_run();
    }
    private static void Gson_level2_run(){
        //1.字节流对象is
        InputStream is= Thread.currentThread()
                .getContextClassLoader()
                .getResourceAsStream("第十七章_XML与JSON/JSON_GSON过滤自定义版/Level2.json");
        //2.字符流对象 in
        InputStreamReader in=new InputStreamReader(is);
        //3.gson的 json字符读取器 对象
        JsonReader jsonreader=new JsonReader(in);
        //4.列表<level2> level2_list
        ArrayList<Level2> level2_list=readGon_level2(jsonreader);
        level2_list.stream().forEach(System.out::println);
        //下面可以包装 json的key和value  array是容器 obj是需要遍历的 集合元素的对象
        JsonArray array=new JsonArray();
        JsonObject obj=new JsonObject();
        for(Level2 n:level2_list){
            obj.addProperty("Class", String.valueOf(n.getClass()));
            obj.addProperty("Id",n.getId());
            obj.addProperty("Text",n.getText());
            obj.addProperty("Geo", String.valueOf(n.getGeo()));
            obj.addProperty("User", String.valueOf(n.getUser()));

            array.add(obj);
        }

        System.out.println(array.toString());
    }
    //返回level2_list<level2>  记得begin和结束是数组
    //将2个对象丢进上面的列表
    private static ArrayList<Level2> readGon_level2(JsonReader jsonreader){
        ArrayList<Level2> list=new ArrayList<Level2>();
        try {
            jsonreader.beginArray();
            while(jsonreader.hasNext()){
                list.add(read_level2(jsonreader));
            }
            jsonreader.endArray();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return list;
    }

    //返回level2 这个格式封装类的各个字段
    private static Level2 read_level2(JsonReader jsonreader) {
        Level2 level2_worker = new Level2();
        try {
            jsonreader.beginObject();
            while (jsonreader.hasNext()) {
                String attrname = jsonreader.nextName();
                if ("id".equals(attrname)) {
                    level2_worker.setId(jsonreader.nextLong());
                } else if ("text".equals(attrname)) {
                    level2_worker.setText(jsonreader.nextString());
                } else if ("geo".equals(attrname) && jsonreader.peek() != JsonToken.NULL) {
                    //这句返回的是一个列表 是double类型的
                    level2_worker.setGeo(readGeo(jsonreader));
                }else if("user".equals(attrname)){
                    //设置  （返回User类型的格式封装）
                    level2_worker.setUser(readUser(jsonreader));
                }else{
                    //加这句免得枚举里面的其他没考虑的类型
                    jsonreader.skipValue();
                }
            }
            jsonreader.endObject();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

        return level2_worker;
    }
    //返回一个列表 double 类型的
    private static ArrayList<Double> readGeo(JsonReader jsonreader){
        ArrayList<Double>list=new ArrayList<>();
        try {
            jsonreader.beginArray();
            while(jsonreader.hasNext()){
                list.add(jsonreader.nextDouble());
            }
            jsonreader.endArray();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return list;
    }
    private static User readUser(JsonReader jsonreader) {
        User user=new User();
        try {
            jsonreader.beginObject();
            while(jsonreader.hasNext()){
                String attrname=jsonreader.nextName();
                if("name".equals(attrname)){
                    user.setName(jsonreader.nextString());
                }else if("followers_count".equals(attrname)){
                    user.setFollowers_count(jsonreader.nextInt());
                }else{
                    jsonreader.skipValue();
                }
            }
            jsonreader.endObject();

        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return user;
    }
}
